{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "std::cout are redirected to python::stdout\n",
      "std::cerr are redirected to python::stderr\n",
      "2021-02-13 00:01:01.515 [HKU-I] - Using SQLITE3 BaseInfoDriver (BaseInfoDriver.cpp:58)\n",
      "2021-02-13 00:01:01.517 [HKU-I] - Loading market information... (StockManager.cpp:503)\n",
      "2021-02-13 00:01:01.519 [HKU-I] - Loading stock type information... (StockManager.cpp:516)\n",
      "2021-02-13 00:01:01.519 [HKU-I] - Loading stock information... (StockManager.cpp:424)\n",
      "2021-02-13 00:01:01.604 [HKU-I] - Loading stock weight... (StockManager.cpp:533)\n",
      "2021-02-13 00:01:02.972 [HKU-I] - Loading KData... (StockManager.cpp:139)\n",
      "2021-02-13 00:01:02.978 [HKU-I] - Preloading all day kdata to buffer! (StockManager.cpp:162)\n",
      "2021-02-13 00:01:03.001 [HKU-I] - 0.03s Loaded Data. (StockManager.cpp:150)\n",
      "Wall time: 2.77 s\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "%time from hikyuu.interactive import *\n",
    "use_draw_engine('matplotlib')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 一、策略分析\n",
    "\n",
    "## 原始描述\n",
    "\n",
    "建仓条件：expma周线exp1跟exp2金叉向上使用使用 B=50% 的资金买入股票，建仓成功后，卖出条件才能起作用\n",
    "\n",
    "卖出条件S1：expma日线exp1和exp2死叉向下时卖出持仓股 S=50%\n",
    "\n",
    "买入条件B1：expma日线exp1和exp2金叉向上时买入股票数为S（卖出条件S1卖出股数）\n",
    "\n",
    "S1和B1就这样循环\n",
    "\n",
    "清仓条件为：expma周线exp1和exp2死叉时\n",
    "\n",
    "\n",
    "## 策略分析\n",
    "\n",
    "市场环境：无\n",
    "\n",
    "系统有效性：周线EMA1（快线）和EMA2（慢线）金叉向上直到两者死叉，系统有效时建立初始仓位\n",
    "\n",
    "信号指示器：\n",
    "- 买入：日线EMA1（快线）和EMA2（慢线）金叉向上\n",
    "- 卖出：日线EMA1（快线）和EMA2（慢线）死叉向下\n",
    "\n",
    "止损/止盈：无\n",
    "\n",
    "资金管理：\n",
    "- 初次建仓：使用50%的资金\n",
    "- 买入：初次建仓时持股数的50%\n",
    "- 卖出：初次建仓时持股数的50%\n",
    "\n",
    "盈利目标：无\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 二、实现系统部件\n",
    "\n",
    "## 自定义系统有效性策略"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def getNextWeekDateList(week):\n",
    "    from datetime import timedelta\n",
    "    py_week = week.datetime()\n",
    "    next_week_start = py_week + timedelta(days = 7 - py_week.weekday())\n",
    "    next_week_end = next_week_start + timedelta(days=5)\n",
    "    return get_date_range(Datetime(next_week_start), Datetime(next_week_end))\n",
    "#ds = getNextWeekDateList(Datetime(201801010000))\n",
    "#for d in ds:\n",
    "#    print(d)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def DEMO_CN(self):\n",
    "    \"\"\" DIF > DEA 时，系统有效\n",
    "    参数：\n",
    "    fast_n：周线dif窗口\n",
    "    slow_n: 周线dea窗口\n",
    "    \"\"\"\n",
    "    k = self.to\n",
    "    if (len(k) <= 10):\n",
    "        return\n",
    "    \n",
    "    #-----------------------------\n",
    "    # 周线        \n",
    "    #-----------------------------\n",
    "    week_q = Query(k[0].datetime, k[-1].datetime, ktype=Query.WEEK)\n",
    "    week_k = k.get_stock().get_kdata(week_q)\n",
    "    \n",
    "    n1 = self.get_param(\"week_macd_n1\")\n",
    "    n2 = self.get_param(\"week_macd_n2\")\n",
    "    n3 = self.get_param(\"week_macd_n3\")\n",
    "    m = MACD(CLOSE(week_k), n1, n2, n3)\n",
    "    fast = m.get_result(0)\n",
    "    slow = m.get_result(1)\n",
    "\n",
    "    x = fast > slow\n",
    "    for i in range(x.discard, len(x)-1):\n",
    "        if (x[i] >= 1.0):\n",
    "            #需要被扩展到日线（必须是后一周）\n",
    "            date_list = getNextWeekDateList(week_k[i].datetime)\n",
    "            for d in date_list:\n",
    "                self._add_valid(d)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 自定义信号指示器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#这个例子不需要，已经有内建的SG_Cross函数可直接使用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 自定义资金管理策略"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DEMO_MM(MoneyManagerBase):\n",
    "    \"\"\"\n",
    "    初次建仓：使用50%的资金\n",
    "    买入：初次建仓时持股数的50%\n",
    "    卖出：初次建仓时持股数的50%\n",
    "    \"\"\"\n",
    "    def __init__(self):\n",
    "        super(DEMO_MM, self).__init__(\"MACD_MM\")\n",
    "        self.set_param(\"init_position\", 0.5) #自定义初始仓位参数，占用资金百分比\n",
    "        self.next_buy_num = 0\n",
    "        \n",
    "    def _reset(self):\n",
    "        self.next_buy_num = 0\n",
    "        #pass\n",
    "        \n",
    "    def _clone(self):\n",
    "        mm = DEMO_MM()\n",
    "        mm.next_buy_num = self.next_buy_num\n",
    "        #return DEMO_MM()\n",
    "    \n",
    "    def _get_buy_num(self, datetime, stk, price, risk, part_from):\n",
    "        tm = self.tm\n",
    "        cash = tm.current_cash\n",
    "        \n",
    "        #如果信号来源于系统有效条件，建立初始仓位\n",
    "        if part_from == System.Part.CONDITION:\n",
    "            #return int((cash * 0.5 // price // stk.atom) * stk.atom)  #MoneyManagerBase其实已经保证了买入是最小交易数的整数\n",
    "            self.next_buy_num = 0 #清理掉上一周期建仓期间滚动买卖的股票数\n",
    "            return int(cash * self.get_param(\"init_position\") // price)\n",
    "        \n",
    "        #非初次建仓，买入同等数量\n",
    "        return self.next_buy_num\n",
    "    \n",
    "    def _getSellNumber(self, datetime, stk, price, risk, part_from):\n",
    "        tm = self.tm\n",
    "        position = tm.get_position(stk)\n",
    "        current_num = int(position.number * 0.5)\n",
    "        \n",
    "        #记录第一次卖出时的股票数，以便下次以同等数量买入\n",
    "        if self.next_buy_num == 0:\n",
    "            self.next_buy_num = current_num \n",
    "            \n",
    "        return current_num #返回类型必须是整数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 三、构建并运行系统\n",
    "\n",
    "## 修改设定公共参数\n",
    "\n",
    "每个系统部件以及TradeManager都有自己的公共参数会影响系统运行，具体可以查看帮助及试验。\n",
    "\n",
    "比如：这个例子当前使用系统有效条件进行初始建仓，那么必须设置系统公共参数cn_open_position为True。否则，没有建立初始仓位的话，后续没有卖出，不会有任何交易。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#System参数\n",
    "#delay=True #(bool) : 是否延迟到下一个bar开盘时进行交易\n",
    "#delay_use_current_price=True #(bool) : 延迟操作的情况下，是使用当前交易时bar的价格计算新的止损价/止赢价/目标价还是使用上次计算的结果\n",
    "#max_delay_count=3 #(int) : 连续延迟交易请求的限制次数\n",
    "#tp_monotonic=True #(bool) : 止赢单调递增\n",
    "#tp_delay_n=3 #(int) : 止盈延迟开始的天数，即止盈策略判断从实际交易几天后开始生效\n",
    "#ignore_sell_sg=False #(bool) : 忽略卖出信号，只使用止损/止赢等其他方式卖出\n",
    "#ev_open_position=False #(bool): 是否使用市场环境判定进行初始建仓\n",
    "\n",
    "cn_open_position=True #(bool): 是否使用系统有效性条件进行初始建仓\n",
    "\n",
    "#MoneyManager公共参数\n",
    "#auto-checkin=False #(bool) : 当账户现金不足以买入资金管理策略指示的买入数量时，自动向账户中补充存入（checkin）足够的现金。\n",
    "#max-stock=20000 #(int) : 最大持有的证券种类数量（即持有几只股票，而非各个股票的持仓数）\n",
    "#disable_ev_force_clean_position=False #(bool) : 禁用市场环境失效时强制清仓\n",
    "#disable_cn_force_clean_position=False #(bool) : 禁用系统有效条件失效时强制清仓\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 设定私有参数及待测试标的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "#账户参数\n",
    "init_cash = 500000 #账户初始资金\n",
    "init_date = '1990-1-1' #账户建立日期\n",
    "\n",
    "#信号指示器参数\n",
    "week_n1 = 12\n",
    "week_n2 = 26\n",
    "week_n3 = 9\n",
    "\n",
    "#选定标的，及测试区间\n",
    "stk = sm['sz000002']\n",
    "\n",
    "#如果是同一级别K线，可以使用索引号，使用了不同级别的K线数据，建议还是使用日期作为参数\n",
    "#另外，数据量太大的话，matplotlib绘图会比较慢\n",
    "start_date = Datetime('2016-01-01')  \n",
    "end_date = Datetime()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## 构建系统实例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "#创建模拟交易账户进行回测，初始资金30万\n",
    "my_tm = crtTM(date=Datetime(init_date), init_cash = init_cash)\n",
    "\n",
    "#创建系统实例\n",
    "my_sys = SYS_Simple()\n",
    "\n",
    "my_sys.set_param(\"cn_open_position\", cn_open_position)\n",
    "\n",
    "my_sys.tm = my_tm\n",
    "my_sys.cn = crtCN(DEMO_CN, \n",
    "              {'week_macd_n1': week_n1, 'week_macd_n2': week_n2, 'week_macd_n3': week_n3}, \n",
    "                'DEMO_CN')  \n",
    "my_sys.sg = SG_Cross(EMA(n=week_n1), EMA(n=week_n2))\n",
    "my_sys.mm = DEMO_MM()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 运行系统"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "q = Query(start_date, end_date, ktype=Query.DAY)\n",
    "my_sys.run(stk, q)\n",
    "\n",
    "#将交易记录及持仓情况，保存在临时目录，可用Excel查看\n",
    "#临时目录一般设置在数据所在目录下的 tmp 子目录\n",
    "#如果打开了excel记录，再次运行系统前，记得先关闭excel文件，否则新的结果没法保存\n",
    "my_tm.tocsv(sm.tmpdir())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 四、查看资金曲线及绩效统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#绘制资金收益曲线\n",
    "x = my_tm.get_profit_curve(stk.get_datetime_list(q), Query.DAY)\n",
    "#x = my_tm.getFundsCurve(stk.getDatetimeList(q), KQuery.DAY) #资金净值曲线\n",
    "PRICELIST(x).plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "帐户初始金额: 500000.00\n",
      "累计投入本金: 500000.00\n",
      "累计投入资产: 0.00\n",
      "累计借入现金: 0.00\n",
      "累计借入资产: 0.00\n",
      "累计红利: 0.00\n",
      "现金余额: 635819.00\n",
      "未平仓头寸净值: 0.00\n",
      "当前总资产: 635819.00\n",
      "已平仓交易总成本: 0.00\n",
      "已平仓净利润总额: 135819.00\n",
      "单笔交易最大占用现金比例%: 49.99\n",
      "交易平均占用现金比例%: 49.78\n",
      "已平仓帐户收益率%: 27.16\n",
      "帐户年复合收益率%: 5.39\n",
      "帐户平均年收益率%: 5.94\n",
      "赢利交易赢利总额: 194799.00\n",
      "亏损交易亏损总额: -58980.00\n",
      "已平仓交易总数: 7.00\n",
      "赢利交易数: 5.00\n",
      "亏损交易数: 2.00\n",
      "赢利交易比例%: 71.43\n",
      "赢利期望值: 19402.71\n",
      "赢利交易平均赢利: 38959.80\n",
      "亏损交易平均亏损: -29490.00\n",
      "平均赢利/平均亏损比例: 1.32\n",
      "净赢利/亏损比例: 3.30\n",
      "最大单笔赢利: 130416.00\n",
      "最大单笔亏损: -50616.00\n",
      "赢利交易平均持仓时间: 34.80\n",
      "赢利交易最大持仓时间: 71.00\n",
      "亏损交易平均持仓时间: 66.50\n",
      "亏损交易最大持仓时间: 94.00\n",
      "空仓总时间: 1364.00\n",
      "空仓时间/总时间%: 81.00\n",
      "平均空仓时间: 194.00\n",
      "最长空仓时间: 431.00\n",
      "最大连续赢利笔数: 3.00\n",
      "最大连续亏损笔数: 1.00\n",
      "最大连续赢利金额: 132099.00\n",
      "最大连续亏损金额: -50616.00\n",
      "R乘数期望值: 0.08\n",
      "交易机会频率/年: 1.53\n",
      "年度期望R乘数: 0.12\n",
      "赢利交易平均R乘数: 0.15\n",
      "亏损交易平均R乘数: -0.10\n",
      "最大单笔赢利R乘数: 0.52\n",
      "最大单笔亏损R乘数: -0.16\n",
      "最大连续赢利R乘数: 0.18\n",
      "最大连续亏损R乘数: -0.16\n",
      "\n"
     ]
    }
   ],
   "source": [
    "#回测统计\n",
    "per = Performance()\n",
    "print(per.report(my_tm, Datetime.now()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 五、或许想看下图形"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "#自己写吧"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 六、或许想看看所有股票的情况"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 28.5 s\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "def calTotal(blk, q):\n",
    "    per = Performance()\n",
    "    s_name = []\n",
    "    s_code = []\n",
    "    x = []\n",
    "    for stk in blk:\n",
    "        my_sys.run(stk, q)\n",
    "        per.statistics(my_tm, Datetime.now())\n",
    "        s_name.append(stk.name)\n",
    "        s_code.append(stk.market_code)\n",
    "        x.append(per[\"当前总资产\"])\n",
    "    return pd.DataFrame({'代码': s_code, '股票': s_name, '当前总资产': x})\n",
    "\n",
    "%time data = calTotal(blocka, q)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>代码</th>\n",
       "      <th>股票</th>\n",
       "      <th>当前总资产</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>SH600770</td>\n",
       "      <td>综艺股份</td>\n",
       "      <td>567335.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>SZ000532</td>\n",
       "      <td>华金资本</td>\n",
       "      <td>584465.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>SZ300238</td>\n",
       "      <td>冠昊生物</td>\n",
       "      <td>780428.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>SH601777</td>\n",
       "      <td>*ST力帆</td>\n",
       "      <td>792940.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>SH600781</td>\n",
       "      <td>*ST辅仁</td>\n",
       "      <td>548118.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>SH600671</td>\n",
       "      <td>*ST目药</td>\n",
       "      <td>411071.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>SZ002888</td>\n",
       "      <td>惠威科技</td>\n",
       "      <td>797464.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>SH603599</td>\n",
       "      <td>广信股份</td>\n",
       "      <td>536307.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>SH600086</td>\n",
       "      <td>退市金钰</td>\n",
       "      <td>621961.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>SH600363</td>\n",
       "      <td>联创光电</td>\n",
       "      <td>644507.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         代码     股票     当前总资产\n",
       "0  SH600770   综艺股份  567335.0\n",
       "1  SZ000532   华金资本  584465.0\n",
       "2  SZ300238   冠昊生物  780428.0\n",
       "3  SH601777  *ST力帆  792940.0\n",
       "4  SH600781  *ST辅仁  548118.0\n",
       "5  SH600671  *ST目药  411071.0\n",
       "6  SZ002888   惠威科技  797464.0\n",
       "7  SH603599   广信股份  536307.9\n",
       "8  SH600086   退市金钰  621961.0\n",
       "9  SH600363   联创光电  644507.0"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#保存到CSV文件\n",
    "#data.to_csv(sm.tmpdir() + '/统计.csv')\n",
    "data[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
